静态存储区 Vs 动态存储区
静态存储区
在C++中,静态存储区是一块固定大小的内存区域,它用于存储全局变量、静态变量和常量。静态存储区在程序编译时就被分配好,并且其大小是固定的,不会随着程序的运行而改变。
静态存储区又可分为数据段(Data Segment)和BSS段(Block Started by Symbol)。数据段用于存储已经初始化的全局变量和静态变量,它的大小在编译时就已经确定,并且这些变量在程序运行时一直存在,直到程序结束。BSS段用于存储未初始化的全局变量和静态变量,它的大小也在编译时确定,但其中的变量在程序启动时都被初始化为0或空指针,因此不需要占用实际的空间。
静态存储区的特点是变量的生命周期与程序的运行时间相同,即在程序启动时被创建,直到程序结束时才被销毁。与动态存储区(堆)不同,静态存储区的变量在程序编译时就已经分配好了内存,因此它们的访问速度比动态存储区更快。
在C++中,使用关键字static可以定义静态变量。静态变量在函数内部使用时,其生命周期也与程序的运行时间相同,但它们的作用域被限制在定义它们的函数内部。在类中使用static关键字可以定义静态成员变量和静态成员函数,它们与类的实例无关,可以直接通过类名进行访问
动态存储区
在C++中,动态存储区是一块程序运行时分配的内存区域,它被称为堆(Heap)。与静态存储区(数据段和BSS段)和栈(Stack)不同,堆的大小是在程序运行时动态分配的,可以根据需要进行扩展或缩小。
使用动态存储区可以解决一些内存管理方面的问题,例如,动态分配的内存空间可以在函数调用之间传递,可以避免静态分配的变量在函数调用之间被销毁。同时,动态存储区还可以帮助我们避免因为变量过多导致栈溢出等问题。
C++中可以使用new和delete运算符来在堆上动态分配和释放内存。new运算符用于动态分配内存,并返回一个指向分配内存的指针,delete运算符用于释放之前分配的内存。具体使用方法如下:
// 动态分配一个整数
int *ptr = new int;
*ptr = 10;
// 动态分配一个整型数组
int *arr = new int[10];
arr[0] = 1;
arr[1] = 2;
// ...
delete ptr; // 释放ptr指向的内存
delete[] arr; // 释放arr指向的内存
需要注意的是,使用new分配内存时,需要使用delete来释放该内存。如果不释放内存,会导致内存泄漏,最终导致程序崩溃。另外,new和delete运算符只能用于动态分配的内存,不能用于栈上分配的变量或静态变量。